﻿// ----------------------------------------------------------------------------------------
// Author:                    Magaly Vargas y Joaquín López
// Company:                   ALBALIA INTERACTIVA S.L.
// Assembly version:          1.0.0.0
// Date:                      22/02/2010
// Time:                      12:00
// Solution Name:             OffInvoiceWordAddIn
// Solution Filename:         OffInvoiceWordAddIn
// Solution FullFilename:     C:\Desarrollo\OffInvoiceWordAddIn
// Project Name:              OffInvoiceWordAddIn
// Project Filename:          OffInvoiceWordAddIn.csproj
// Project FullFilename:      C:\Desarrollo\OffInvoiceWordAddIn\OffInvoiceWordAddIn.csproj
// Project Item Name:         OffInvoiceWordAddIn.cs
// Project Item Filename:     OffInvoiceWordAddIn.cs
// Project Item FullFilename: C:\Desarrollo\OffInvoiceWordAddIn\OffInvoiceWordAddIn.cs
// Project Item Kind:         Código
// Purpose:                   
//Copyright © 2009 - 2010 Albalia Interactiva S.L. Reservados todos los derechos.
// ----------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OffInvoiceWordAddIn.FacturaeFiles;
using System.Globalization;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;

namespace OffInvoiceWordAddIn
{
    /// <summary>
    /// Clase que controla la busqueda de la plantilla que mejor se ajuste a la factura que se desea importar.
    /// </summary>
    class TemplateController
    {

        #region "Fields"

        /// <summary>
        /// Variable de tipo char[] que contiene los caracteres que se deben elimiar cuando se cogen los valores
        /// de los controles de la plantilla.
        /// </summary>
        char[] x = { '\r', '\a', '\n' };

        /// <summary>
        /// Variables de tipo int que refencian a una numeración específica de las tablas de una planilla facturae
        /// Si alguna de estas referencias falla, significa qe no estamos trabajando con una plantilla válida.
        /// </summary>
        public int t1, t2, t3, t4, t5, t6, t7;

        /// <summary>
        /// idioma de la aplicacion
        /// </summary>
        private string language;

        /// <summary>
        /// Variable de tipo string con el valor de la variable de entorno
        /// </summary>
        public string EnvironmentVariable = "";

        /// <summary>
        /// Variable de tipo string que contine el valor del directorio de las plantillas
        /// </summary>
        public string TemplatesDirectories = "";

        #endregion

        #region "Constructors"

        /// <summary>
        /// Constructor
        /// </summary>
        public TemplateController()
        {
            //InvoiceCulture = CultureInfo.InstalledUICulture;
            EnvironmentVariable = System.Environment.GetEnvironmentVariable("APPDATA");
            CultureInfo cInfo = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            language = cInfo.Name;
            TemplatesDirectories = string.Concat(language, @"\");
        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método que selecciona la plantilla que mejor se ajusta a un Facturae
        /// </summary>
        /// <param name="facturae">Factura</param>
        /// <param name="corrective">Parémetro que indica si se desea generar una factura rectificativa a partir de otra</param>
        /// <param name="saveOptions">Parámetro que indica si se desean guardar cambios o no</param>
        public void setTemplateType(Facturae facturae, bool corrective, bool saveOptions)
        {
            try
            {

                string invoiceIssuer = facturae.FileHeader.InvoiceIssuerType.ToString("g");
                string invoiceClass = facturae.Invoices[0].InvoiceHeader.InvoiceClass.ToString("g");
                string template = EnvironmentVariable + Paths.TemplatePath + TemplatesDirectories;
                Language labels = Language.getInstance();
                if (invoiceIssuer.ToUpper().Equals("TE"))
                {
                    if (invoiceClass.ToUpper().Equals("OR") || corrective)
                        template += labels.getLabels("CorrectiveAndThirdTemplate")+".dotx";
                    else

                        template += labels.getLabels("ThirdTemplate")+".dotx";
                }
                else
                {
                    if (invoiceClass.ToUpper().Equals("OR") || corrective)
                        template += labels.getLabels("CorrectiveTemplate")+".dotx";
                    else
                        template += labels.getLabels("BasicTemplate")+".dotx";

                }

                object temp = template;
                LoadInvoiceTemplate(temp, saveOptions);

            }
            catch (Exception) { }

        }

        /// <summary>
        /// Método que carga la plantilla
        /// </summary>
        /// <param name="temp">Parámetro de tipo object con la plantilla</param>
        /// <param name="saveOptions">Parámetro de tipo bool que indica si se muestra al usuario la opcion de guardar los cambios o no.</param>
        public void LoadInvoiceTemplate(object temp, bool saveOptions)
        {
            try
            {
                object template = temp;
                object oMissing = System.Reflection.Missing.Value;
                object doNotSaveChanges;

                if (saveOptions)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    DialogResult dr = MessageBox.Show(msg.getMessage(ControlMessages.Msg.InfoSaveDialog), msg.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                    if (dr.Equals(DialogResult.Yes))
                    {
                        doNotSaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges;
                    }
                    else
                    {
                        doNotSaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
                        if (dr.Equals(DialogResult.Cancel))
                            throw new Exception();

                    }
                }
                else
                {
                    doNotSaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
                }

                try
                {
                    Globals.ThisAddIn.Application.ActiveDocument.Close(ref doNotSaveChanges, ref oMissing, ref oMissing);
                }
                catch (Exception)
                {
                }


                Globals.ThisAddIn.Application.Documents.Add(ref template, ref oMissing, ref oMissing, ref oMissing);

            }
            catch (Exception) { }
        }

        /// <summary>
        /// Método que numera las tabla del documento
        /// </summary>
        public void enumerateTables()
        {
            try
            {
                Word.Document activeDoc = null;
                activeDoc = Globals.ThisAddIn.Application.ActiveDocument;

                if (activeDoc != null)
                {


                    int count = activeDoc.Tables.Count;
                    if (count <= 0)
                    {
                        ControlMessages msg = ControlMessages.getInstance();
                        throw new Exception(msg.getMessage(ControlMessages.Msg.ErrorNotValidTemplate));
                    }
                    else
                    {

                        for (int i = 2; i <= activeDoc.Tables.Count; i++)
                        {
                            try
                            {
                                string table = activeDoc.Tables[i].Rows[1].Cells[1].Range.Text.Trim(x).Trim();
                                t1 = 1;
                                switch (table)
                                {

                                    case "2":
                                        t2 = i; break;
                                    case "3":
                                        t3 = i; break;
                                    case "6":
                                        t4 = i; break;
                                    case "4":
                                        t5 = i; break;
                                    case "1":
                                        t6 = i; break;
                                    case "7":
                                        t7 = i; break;

                                }
                            }
                            catch (Exception) { }
                        }
                    }
                }
            }
            catch (Exception) { }
        }

        #endregion
    }
}
